package com.zhf.JDBC03;

import com.zhf.utils.JDBCUtils;

import java.sql.*;
import java.util.Scanner;

/**
 * @Author: ZhaoHuanfeng
 * @Date: 2020/9/23 21:58
 */
public class TestLogin02 {

    /**
     * SQL注入
     *  用户输入的用户名和密码与我们编写的SQL进行了拼接
     *  用户输入的内容成为了SQL语法的一部分
     *  用户利用这个漏洞 输入一些其他字符串，改变SQL原有信息
     *
     * 解决方案
     *  不能让用户输入的数据和我们的SQL进行拼接
     *
     * 预处理对象preparestatement 是statement接口的子接口
     *  使用预处理对象有预编译功能，提高SQL执行效率
     *  使用预处理对象，通过占位符的方式设置参数可以有效防止SQL注入
     */
    public static void main(String[] args) throws SQLException {
        //获取连接
        Connection connection = JDBCUtils.getConnection();

        //获取preparestatement预处理对象
        String sql="select * from jdbc_user where username=? and password=?";
        PreparedStatement preparedStatement = connection.prepareStatement(sql);

        //用户输入用户名和密码
        Scanner sc=new Scanner(System.in);
        System.out.println("请输入用户名：");
        String usename=sc.nextLine();
        System.out.println("请输入密码：");
        String password=sc.nextLine();

        //设置参数 使用setXXX(占位符的位置，要设置的值)方法设置占位符的参数
        preparedStatement.setString(1,usename);     //设置第一个问号的值
        preparedStatement.setString(2,password);    //设置第二个问号的值

        //执行查询
        ResultSet resultSet = preparedStatement.executeQuery();

        //处理结果
        if (resultSet.next()){
            System.out.println("欢迎登录"+usename);
        }else {
            System.out.println("登录失败");
        }

        //关闭流
        JDBCUtils.close(connection,preparedStatement,resultSet);
    }
}
